home *** CD-ROM | disk | FTP | other *** search
/ Openstep 4.2 (Developer) / Openstep Developer 4.2.iso / NextDeveloper / Source / GNU / uucp / Uucp.framework / uuconf.subproj / cmdarg.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-09  |  4.8 KB  |  186 lines

  1. /* cmdarg.c
  2.    Look up a command with arguments in a command table.
  3.  
  4.    Copyright (C) 1992 Ian Lance Taylor
  5.  
  6.    This file is part of the Taylor UUCP uuconf library.
  7.  
  8.    This library is free software; you can redistribute it and/or
  9.    modify it under the terms of the GNU Library General Public License
  10.    as published by the Free Software Foundation; either version 2 of
  11.    the License, or (at your option) any later version.
  12.  
  13.    This library is distributed in the hope that it will be useful, but
  14.    WITHOUT ANY WARRANTY; without even the implied warranty of
  15.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.    Library General Public License for more details.
  17.  
  18.    You should have received a copy of the GNU Library General Public
  19.    License along with this library; if not, write to the Free Software
  20.    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  21.  
  22.    The author of the program may be contacted at ian@airs.com or
  23.    c/o Cygnus Support, 48 Grove Street, Somerville, MA 02144.
  24.    */
  25.  
  26. #include "uucnfi.h"
  27.  
  28. #if USE_RCS_ID
  29. const char _uuconf_cmdarg_rcsid[] = "$Id: cmdarg.c,v 1.6 1995/06/21 19:21:50 ian Rel $";
  30. #endif
  31.  
  32. #include <ctype.h>
  33.  
  34. #undef strcmp
  35. #if HAVE_STRCASECMP
  36. #undef strcasecmp
  37. #endif
  38. extern int strcmp (), strcasecmp ();
  39.  
  40. /* Look up a command with arguments in a table and execute it.  */
  41.  
  42. int
  43. uuconf_cmd_args (pglobal, cargs, pzargs, qtab, pinfo, pfiunknown, iflags,
  44.          pblock)
  45.      pointer pglobal;
  46.      int cargs;
  47.      char **pzargs;
  48.      const struct uuconf_cmdtab *qtab;
  49.      pointer pinfo;
  50.      int (*pfiunknown) P((pointer, int, char **, pointer, pointer));
  51.      int iflags;
  52.      pointer pblock;
  53. {
  54.   struct sglobal *qglobal = (struct sglobal *) pglobal;
  55.   int bfirstu, bfirstl;
  56.   int (*pficmp) P((const char *, const char *));
  57.   register const struct uuconf_cmdtab *q;
  58.   int itype;
  59.   int callowed;
  60.  
  61.   bfirstu = bfirstl = pzargs[0][0];
  62.   if ((iflags & UUCONF_CMDTABFLAG_CASE) != 0)
  63.     pficmp = strcmp;
  64.   else
  65.     {
  66.       if (islower (bfirstu))
  67.     bfirstu = toupper (bfirstu);
  68.       if (isupper (bfirstl))
  69.     bfirstl = tolower (bfirstl);
  70.       pficmp = strcasecmp;
  71.     }
  72.  
  73.   itype = 0;
  74.  
  75.   for (q = qtab; q->uuconf_zcmd != NULL; q++)
  76.     {
  77.       int bfirst;
  78.  
  79.       bfirst = q->uuconf_zcmd[0];
  80.       if (bfirst != bfirstu && bfirst != bfirstl)
  81.     continue;
  82.  
  83.       itype = UUCONF_TTYPE_CMDTABTYPE (q->uuconf_itype);
  84.       if (itype != UUCONF_CMDTABTYPE_PREFIX)
  85.     {
  86.       if ((*pficmp) (q->uuconf_zcmd, pzargs[0]) == 0)
  87.         break;
  88.     }
  89.       else
  90.     {
  91.       size_t clen;
  92.  
  93.       clen = strlen (q->uuconf_zcmd);
  94.       if ((iflags & UUCONF_CMDTABFLAG_CASE) != 0)
  95.         {
  96.           if (strncmp (q->uuconf_zcmd, pzargs[0], clen) == 0)
  97.         break;
  98.         }
  99.       else
  100.         {
  101.           if (strncasecmp (q->uuconf_zcmd, pzargs[0], clen) == 0)
  102.         break;
  103.         }
  104.     }
  105.     }
  106.  
  107.   if (q->uuconf_zcmd == NULL)
  108.     {
  109.       if (pfiunknown == NULL)
  110.     return UUCONF_CMDTABRET_CONTINUE;
  111.       return (*pfiunknown) (pglobal, cargs, pzargs, (pointer) NULL, pinfo);
  112.     }
  113.  
  114.   callowed = UUCONF_CARGS_CMDTABTYPE (q->uuconf_itype);
  115.   if (callowed != 0 && callowed != cargs)
  116.     return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT;
  117.  
  118.   switch (itype)
  119.     {
  120.     case UUCONF_TTYPE_CMDTABTYPE (UUCONF_CMDTABTYPE_STRING):
  121.       if (cargs == 1)
  122.     *(char **) q->uuconf_pvar = (char *) "";
  123.       else if (cargs == 2)
  124.     *(char **) q->uuconf_pvar = pzargs[1];
  125.       else
  126.     return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT;
  127.  
  128.       return UUCONF_CMDTABRET_KEEP;
  129.  
  130.     case UUCONF_TTYPE_CMDTABTYPE (UUCONF_CMDTABTYPE_INT):
  131.       return _uuconf_iint (qglobal, pzargs[1], q->uuconf_pvar, TRUE);
  132.  
  133.     case UUCONF_TTYPE_CMDTABTYPE (UUCONF_CMDTABTYPE_LONG):
  134.       return _uuconf_iint (qglobal, pzargs[1], q->uuconf_pvar, FALSE);
  135.  
  136.     case UUCONF_TTYPE_CMDTABTYPE (UUCONF_CMDTABTYPE_BOOLEAN):
  137.       return _uuconf_iboolean (qglobal, pzargs[1], (int *) q->uuconf_pvar);
  138.  
  139.     case UUCONF_TTYPE_CMDTABTYPE (UUCONF_CMDTABTYPE_FULLSTRING):
  140.       if (cargs == 1)
  141.     {
  142.       char ***ppz = (char ***) q->uuconf_pvar;
  143.       int iret;
  144.       
  145.       *ppz = NULL;
  146.       iret = _uuconf_iadd_string (qglobal, (char *) NULL, FALSE, FALSE,
  147.                       ppz, pblock);
  148.       if (iret != UUCONF_SUCCESS)
  149.         return iret | UUCONF_CMDTABRET_EXIT;
  150.  
  151.       return UUCONF_CMDTABRET_CONTINUE;
  152.     }
  153.       else
  154.     {
  155.       char ***ppz = (char ***) q->uuconf_pvar;
  156.       int i;
  157.  
  158.       *ppz = NULL;
  159.       for (i = 1; i < cargs; i++)
  160.         {
  161.           int iret;
  162.  
  163.           iret = _uuconf_iadd_string (qglobal, pzargs[i], FALSE, FALSE,
  164.                       ppz, pblock);
  165.           if (iret != UUCONF_SUCCESS)
  166.         {
  167.           *ppz = NULL;
  168.           return iret | UUCONF_CMDTABRET_EXIT;
  169.         }
  170.         }
  171.  
  172.       return UUCONF_CMDTABRET_KEEP;
  173.     }
  174.  
  175.     case UUCONF_TTYPE_CMDTABTYPE (UUCONF_CMDTABTYPE_FN):
  176.     case UUCONF_TTYPE_CMDTABTYPE (UUCONF_CMDTABTYPE_PREFIX):
  177.       return (*q->uuconf_pifn) (pglobal, cargs, pzargs, q->uuconf_pvar,
  178.                 pinfo);
  179.  
  180.     default:
  181.       return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT;
  182.     }
  183.  
  184.   /*NOTREACHED*/
  185. }
  186.